﻿package org.cshoo.sys.business.service;

import java.util.ArrayList;
import java.util.List;

import org.cshoo.sys.business.iservice.IAuthorityService;
import org.cshoo.sys.data.entity.Authority;
import org.cshoo.sys.data.entity.Menu;
import org.cshoo.sys.data.entity.Role;
import org.cshoo.sys.data.entity.User;
import org.cshoo.sys.data.idao.IAuthorityDAO;

/**
 * @author 杨翼 
 * create 2012年10月7日
 * 权限管理业务处理类
 */
public class AuthorityService implements IAuthorityService{
	
	private IAuthorityDAO authorityDAO;

	public void setAuthorityDAO(IAuthorityDAO authorityDAO) {
		this.authorityDAO = authorityDAO;
	}
	
	/**
	 * 根据角色获取权限，即获取给定角色的菜单权限
	 * @param role
	 * @return
	 */
	public List findRoleAuthorityList(Role role){
		Authority authorityExample = new Authority();
		authorityExample.setType("角色菜单权限");
		authorityExample.setRole(role);
		return authorityDAO.findObjectListByExample(authorityExample);
	}
	
	/**
	 * 根据用户获取权限，即获取给定用户的菜单权限
	 * @param user
	 * @return
	 */
	public List findUserAuthorityList(User user){
		Authority authorityExample = new Authority();
		authorityExample.setType("用户菜单权限");
		authorityExample.setUser(user);
		return authorityDAO.findObjectListByExample(authorityExample);
	}
	
	/**
	 * 为角色添加菜单权限
	 * 这里用的方法很简单，先删除原有的权限，然后重新给它授权
	 * @param role 要添加权限的角色
	 * @param menuList 要添加权限的菜单
	 * @return
	 */
	public Boolean addRoleAuthorityList(Role role,List<Menu> menuList)
	{
		Boolean result = false;
		
		///删除此角色的原有权限
		Authority authority = new Authority();
		authority.setRole(role);
		List oldAuthorityList = authorityDAO.findObjectListByExample(authority);
		authorityDAO.deleteAllObjectList(oldAuthorityList);
		
		///为此角色重新授权
		List newAuthorityList = new ArrayList();
		for(Menu menu : menuList)
		{
			Authority authorityTemp = new Authority();
			authorityTemp.setCode(role.getCode() + "★" + menu.getCode());//这里给权限编号赋值为“角色编号★菜单编号”，为了程序稳定性，建议前台角色编号和菜单编号输入中不能包含“★”
			authorityTemp.setName(role.getName() + "★" + menu.getName());//这里给权限名称赋值为“角色名称★菜单名称”，为了程序稳定性，建议前台角色名称和菜单名称输入中不能包含“★”
			authorityTemp.setType("角色菜单权限");
			authorityTemp.setRole(role);
			authorityTemp.setMenu(menu);
			newAuthorityList.add(authorityTemp);
		}
		authorityDAO.addOrUpdateAllObjectList(newAuthorityList);
		
		result = true;
		
		return result;
	}
	
	
	/**
	 * 为用户添加菜单权限
	 * 这里用的方法很简单，先删除原有的权限，然后重新给它授权
	 * @param user 要添加权限的用户
	 * @param menuList 要添加权限的菜单
	 * @return
	 */
	public Boolean addUserAuthorityList(User user,List<Menu> menuList)
	{
		
		Boolean result = false;
		
		//删除此角色的原有权限
		Authority authority = new Authority();
		authority.setUser(user);
		List oldAuthorityList = authorityDAO.findObjectListByExample(authority);
		authorityDAO.deleteAllObjectList(oldAuthorityList);
		
		//为此角色重新授权
		List newAuthorityList = new ArrayList();
		for(Menu menu : menuList)
		{
			Authority authorityTemp = new Authority();
			authorityTemp.setCode(user.getUserName() + "★" + menu.getCode());//这里给权限编号赋值为“用户名★菜单编号”，为了程序稳定性，建议前台用户名和菜单编号输入中不能包含“★”
			authorityTemp.setName(user.getUserName() + "★" + menu.getName());//这里给权限名称赋值为“用户名★菜单名称”，为了程序稳定性，建议前台用户名和菜单名称输入中不能包含“★”
			authorityTemp.setType("用户菜单权限");
			authorityTemp.setUser(user);
			authorityTemp.setMenu(menu);
			newAuthorityList.add(authorityTemp);
		}
		authorityDAO.addOrUpdateAllObjectList(newAuthorityList);
		
		result = true;
		
		return result;
	}
}
